/** Fichier définissant un ellipsoide.
 *
 * Ce fichier contient la définition de la classe Ellipsoide.
 *
 * @file Ellipsoide.hpp
 * @author Johan "Solo" Luisier
 * @date 23 Juin 2011
 */
#ifndef _ELLIPSOIDE_H
#define _ELLIPSOIDE_H

#include "Forme.hpp"

/** Classe implémentant l'ellipsoïde pour le raytracing.
 *
 * Cette classe implémente l'ellipsoïde pour le raytracing. Un ellipsoïde est
 * défini dans les coordonnées locales par ses trois rayons.
 *
 * Pour se simplifier la vie, on se ramère à une sphère unité lors du calcul
 * d'intersections, d'appartenance au volume (estDans) ou à la surface
 * (estSur).
 *
 * Forme::PseudoCentre est défini comme le centre de gravité de l'ellispoïde.
 *
 * @author Johan "Solo" Luisier
 *
 * @date 23 Juin 2011
 *
 * @class Ellipsoide "Ellipsoide.hpp" "Formes/Ellipsoide.hpp"
 */
class Ellipsoide : public Forme
{
public:
    Ellipsoide();
    Ellipsoide(const Coord& pt, const VecteurU& x, const VecteurU& y,
               const double& rx, const double& ry, const double& rz);
    Ellipsoide(const Ellipsoide &);
    ~Ellipsoide();
    Coord trouveIntersection(Rayon const &) const;
    VecteurU normale(Coord const &) const;
    bool estDans(Coord const &) const;
    bool estSur(Coord const &) const;

    void mapping(const Coord &, int &i, int &j, const int &frequence, const int &Hauteur, const int &Largeur) const;

    const double& rayonX() const;
    const double& rayonY() const;
    const double& rayonZ() const;
    const Coord& centre() const;
    std::ostream& affiche(std::ostream& os) const;
    Coord intrinseque(const Coord& pt) const;
    Coord intrinsequeReduite(const Coord& pt, const double& larg) const;
private:
    /**
     * Centre de l'Ellipsoide.
     */
    Coord Centre;
    /**
     * Axe x de l'Ellipsoide
     */
    VecteurU AxeX;
    /**
     * Axe y de l'Ellipsoide
     */
    VecteurU AxeY;
    /**
     * Axe z de l'Ellipsoide
     */
    VecteurU AxeZ;
    /**
     * Rayon de l'Ellipsoide selon Ox.
     */
    double RayonX;
    /**
     * Rayon de l'Ellipsoide selon Oy.
     */
    double RayonY;
    /**
   * Rayon de l'Ellipsoide selon Oz.
   */
    double RayonZ;
    /**
     * Matrice permettant de passer d'un ellipsoïde à une sphère pour se
     * simplifier la vie.
     */
    MatriceGL3 VersSphere;
};

#endif
